package guiasaude.reps;

import excecoes.ObjetoInexistenteException;
import excecoes.ObjetoJaExistenteException;
import excecoes.RepositorioException;
import fachada.Fachada;
import guiasaude.UnidadeSaude;
import util.factory.FabricaRepositorio;
import util.repGeral.IRepositorioRegistro;
import util.repGeral.Registro;

public class RepositorioUnidadeSaude implements IRepositorioUnidadeSaude {

	/* Delegation */
	private IRepositorioRegistro repRegistro;	
	
	/* Singleton */
	private static RepositorioUnidadeSaude instance = null;
	
	private RepositorioUnidadeSaude() {
		// inicializando o atributo delegation
		this.repRegistro = FabricaRepositorio.getRepRegistroPorTipo(Fachada.getTipoRep());		
	}
	public static RepositorioUnidadeSaude getInstance() {
		if (instance == null) {
			instance = new RepositorioUnidadeSaude();
		}
		return instance;
	}		
	
	public void atualiza(UnidadeSaude us) throws RepositorioException, ObjetoInexistenteException {
		this.repRegistro.atualiza(us);		
	}

	public void deleta(int codigo) throws RepositorioException, ObjetoInexistenteException {
		this.repRegistro.deleta(codigo);
	}

	public boolean existe(int codigo) throws RepositorioException {
		boolean retorno = this.repRegistro.existe(codigo);
		return retorno;
	}

	public int insere(UnidadeSaude us) throws RepositorioException, ObjetoJaExistenteException {
		return this.repRegistro.insere(us);
	}

	public UnidadeSaude procura(int codigo) throws RepositorioException, ObjetoInexistenteException {
		Registro r = this.repRegistro.procura(codigo);
		return (UnidadeSaude)r;
	}

	public int size() {
		return this.repRegistro.size();
	}
	
	public UnidadeSaude getElemento(int posicao) {
		return (UnidadeSaude) this.repRegistro.getElement(posicao);
	}
	
	public IRepositorioUnidadeSaude getListaUnidadeSaude() throws RepositorioException, ObjetoInexistenteException {
		return this;
	}
	public IRepositorioUnidadeSaude getListaUnidadeSaudeporEspecialidade(int codEspecialidade) throws RepositorioException, ObjetoInexistenteException, ObjetoJaExistenteException {
		RepositorioUnidadeSaude rep = new RepositorioUnidadeSaude();
		IteratorUnidadeSaude i = this.getIterator();
		while (i.hasNext()) {
			UnidadeSaude us = i.next();
			if (us.getCodigo() == codEspecialidade) {
				rep.insere(us);
			}
		}
		return rep;
	}
	public IteratorUnidadeSaude getIterator() {
		return new IteratorUnidadeSaude(this.repRegistro.getIterator());
	}

}
